﻿package com.gudogudo.battleworm.element {
	import flash.utils.getTimer;
	
	import Box2D.Common.Math.*;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2World;	

	/**
	 * @author zhangs
	 */
	public class AbstractElement {
		public static var NONESPEED : b2Vec2 = new b2Vec2(0, 0);		// 静止速度
		public static var CHECKMINMAGNITUDE : Number = 2;		// 静止检测速度参考值
		public static var CHECKDTIME : Number = 200;					// 静止检测时间间隔（毫秒）
		
		public var m_world:b2World;
		public var body : b2Body;			// Box2D使用的元件
		
		internal var speed : b2Vec2 = new b2Vec2(0, 0);	// 物体速度
		internal var checkTime : Number = 0;		// 静止检测变量，保存系统时间
		internal var auto : Boolean = true;			// 自动由系统控制，或手动控制
		
		public function AbstractElement(m_world:b2World) {
			this.m_world = m_world;
		}
		
		// 设置物体速度
		public function setSpeed(speed : b2Vec2) : void {
			this.speed = speed;
			body.WakeUp();
			checkTime = getTimer();
		}
		
		// 实时速度设置及静止检测
		public function run() : void {
			var v : b2Vec2 = body.GetLinearVelocity();
			if (!auto) {
				v.x = speed.x;
			}
			if (v.LengthSquared() >= CHECKMINMAGNITUDE) {
				checkTime = getTimer();
			}
//			trace(body.IsSleeping(), v.LengthSquared(), checkTime, getTimer());
			if (body.IsSleeping()) {
				
			} else if(speed.Length()==0 && v.LengthSquared()<CHECKMINMAGNITUDE && getTimer()>=checkTime+CHECKDTIME) {
				body.PutToSleep();
			} else {
				body.SetLinearVelocity(v);
			}
		}
		
		public function getPosition() : b2Vec2 {
			return body.GetPosition();
		}
	}
}
